﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Classes;
using Classes.cadastro;
using System.Data;
using System.Data.SqlClient;


namespace Classes
{
    public class ClassLookup
    {
        /* Lista de Campos */
        public List<LookupCampo> Campos;

        public string StrConn { get; set; }
        public SqlConnection SqlCon { get; set; }
        public SqlCommand cmd { get; set; }
        public DataSet ds { get; set; }
        public DataTable dataTable { get; set; }
        public Form Owner { get; set; }

        public DataGridView dgvLookup { get; set; }
        public ComboBox cmbCampos { get; set; }
        public ComboBox cmbCondicao { get; set; }
        public Button btnPesquisar { get; set; }
        public List<Coluna> Colunas;
        public Boolean MostraForm = true;

        public FormLookupPadrao FormLookup { get; set; }
        public TextBox txtCond { get; set; }
        public DateTimePicker dtCond1 { get; set; }
        public DateTimePicker dtCond2 { get; set; }
        public CurrencyEdit crCond1 { get; set; }
        public CurrencyEdit crCond2 { get; set; }

        public string Nome { get; set; }
        public string Value { get; set; }
        public Boolean Returning { get; set; } /* Verifica se vai ser retornado valor - Caso a tela não seja fechada via doubleclick ou pelo botão confirmar, não retornar */
        public string Tabela { get; set; }
        public string[] Retorno;
        public string Join { get; set; }
        public string CondPadrao { get; set; }
        public string Ordem { get; set; }

        private string[] mRetorno;

        /* Construtor */
        public ClassLookup(string pStrConn, Form pOwner, string pValue = "")
        {
            Campos = new List<LookupCampo>();
            Colunas = new List<Coluna>();

            Owner = pOwner;
            Value = pValue;
            Returning = false;

            StrConn = pStrConn;
        }
        /* FIM - Construtor */


        public void Show()
        {
            FormLookupPadrao FormLookup = new FormLookupPadrao();
            //FormLookup.MdiParent = Owner;
            FormLookup.Text += ": " + Nome;
            cmbCampos = FormLookup.cmbCampo;
            cmbCondicao = FormLookup.cmbCondicao;
            btnPesquisar = FormLookup.btnPesquisar;
            dgvLookup = FormLookup.dataGridView1;
            txtCond = FormLookup.tbxConteudo;
            dtCond1 = FormLookup.dtCondicao1;
            dtCond2 = FormLookup.dtCondicao2;
            crCond1 = FormLookup.cedtCondicao1;
            crCond2 = FormLookup.cedtCondicao2;
            FormLookup.cLookup = this;


            FormLookup.FormClosed += new FormClosedEventHandler(FormLookup_FormClosed);

            /* Evento mudar selecao */
            cmbCampos.SelectedValueChanged += new EventHandler(onChangeCampos);

            /* Evento Pesquisar */
            btnPesquisar.Click += new EventHandler(onPesquisar);

            Preparar(StrConn);

            if (Value.Trim() != "")
                onPesquisar(null, null);

            if (MostraForm)
                FormLookup.ShowDialog();
        }


        /* Closed Event */
        public void FormLookup_FormClosed(Object sender, FormClosedEventArgs e)
        { 
            //ret        
        }

 
        /* Retorna os valores da linha selecionada */
        public string[] Retonar
        {
            get
            {
                mRetorno = new string[Retorno.Length];

                if ((dgvLookup.CurrentRow != null) && (Returning))
                {
                    for (int i = 0; i <= Retorno.Length - 1; i++)
                        mRetorno[i] = dgvLookup.CurrentRow.Cells["ret" + i.ToString()].Value.ToString();
                }
                else
                    for (int i = 0; i <= Retorno.Length - 1; i++)
                        mRetorno[i] = "";

                return mRetorno;
            }
        }


        /* Evento Mudar Seleção */ 
        public void onChangeCampos(Object Sender, EventArgs e)
        {
            PreencherCondicoes(); /* Preenche o default - caso não encontre o tipo */

            txtCond.Visible = false;
            dtCond1.Visible = false;
            dtCond2.Visible = false;
            crCond1.Visible = false;
            crCond2.Visible = false;

            foreach (LookupCampo campo in Campos)
            {
                if (campo.Nome == cmbCampos.Text)
                {
                    PreencherCondicoes(campo.Tipo);

                    if (campo.Tipo == "char")
                        txtCond.Visible = true;
                    else if (campo.Tipo == "crr")
                    {
                        crCond1.Visible = true;
                        crCond2.Visible = true;
                    }
                    else if (campo.Tipo == "dt")
                    {
                        dtCond1.Visible = true;
                        dtCond2.Visible = true;
                    }
                }
            }
        }
        /* FIM - Evento Mudar Seleção */


        /* Evento Pesquisar */
        public void onPesquisar(Object Sender, EventArgs e)
        {
            string sSQL = "";
            sSQL = GetSQL(Value);

            Value = "";

            try
            {
                SqlConnection SqlCon = new SqlConnection(StrConn);
                if (SqlCon.State == ConnectionState.Closed)
                    SqlCon.Open();
                cmd = new SqlCommand(sSQL, SqlCon);
                ds = new DataSet();

                /* Executa a query */
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                dataTable = new DataTable();

                /* Faz o retorno dentro do dataset */
                da.Fill(dataTable);
                da.Dispose();

                if (dataTable.Rows.Count == 1)
                {
                    Returning = true;
                    dgvLookup.DataSource = dataTable;
                    MostraForm = false;
                }
                else
                    dgvLookup.DataSource = dataTable;

                //return dataTable;
            }
            catch (Exception ee)
            {
                MessageBox.Show("Erro ao pesquisar dados.\r\nErro-> " + ee.Message, "Erro",
                                 MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            finally
            {
                try { SqlCon.Close(); }
                catch { }
            }

        }
        /* FIM - Evento Pesquisar */


        /* Retorna o SELECT do filtro feito */
        private string GetSQL(string pDefault)
        {
            string ret = "SELECT DISTINCT ";

            /* Retorno */
            for (int i = 0; i <= Retorno.Length-1;  i++)
            {
                if (i > 0) ret += ", ";

                ret += " " + Retorno[i] + " as ret" + i.ToString();
            }

            /* Colunas */
            foreach (Coluna coluna in Colunas)
            {
                ret += ", " + coluna.Field;
            }

            /* From */
            ret += " FROM " + Tabela;
            
            /* JOIN */
            if (Join != null)
                if (Join.Trim() != "")
                    ret += Join;

            /* WHERE */
            ret += " WHERE 1=1 ";

            if (pDefault.Trim() != "")
                ret += " AND " + Retorno[0] + " = '" + pDefault.Trim() + "' ";


            if (CondPadrao != null) 
                if (CondPadrao.Trim() != "")
                    ret += " " + CondPadrao;

            if (Ordem != null)
                if (Ordem.Trim() != "")
                    ret += " " + Ordem;

            
            return ret;        
        }


        /* Adiciona um novo campo */
        public void AddCampo(string pField, string pNome, string pTipo)
        {
            LookupCampo lcmp = new LookupCampo();
            lcmp.Field = pField;
            lcmp.Nome = pNome;
            lcmp.Tipo = pTipo;

            Campos.Add(lcmp);
        }
        /* FIM - Adiciona um novo campo */


        /* Adiciona uma nova Coluna */
        public void AddColuna(string pField, string pFormato, int pLargura, string pNome, Boolean pVisivel)
        {
            Coluna cl = new Coluna();
            cl.Field = pField;
            cl.formato = pFormato;
            cl.largura = pLargura;
            cl.Nome = pNome;
            cl.visivel = pVisivel;

            Colunas.Add(cl);        
        }
        /* FIM - Adiciona uma nova Coluna */


        /* Preencher Condicoes */
        private void PreencherCondicoes(string pTipo = "")
        {
            if (pTipo == "char")
            {
                cmbCondicao.Items.Clear();
                cmbCondicao.Items.Insert(0, "Contendo");
                cmbCondicao.Items.Insert(1, "Iniciando com");
                cmbCondicao.Items.Insert(2, "Finalizando com");
                cmbCondicao.Items.Insert(3, "Igual");
                cmbCondicao.Items.Insert(4, "Diferente");
            }
            else 
            {
                cmbCondicao.Items.Clear();
                cmbCondicao.Items.Insert(0, "Igual");
                cmbCondicao.Items.Insert(1, "Maior que");
                cmbCondicao.Items.Insert(2, "Menor que");
                cmbCondicao.Items.Insert(3, "Diferente");
                cmbCondicao.Items.Insert(4, "Entre");
            }

            cmbCondicao.SelectedIndex = 0;
        }
        /* FIM - Preencher Condicoes */


        /* Prepara a tela */
        private void Preparar(string Connection)
        {
            StrConn = Connection;
            


            int i = 0;
            cmbCampos.Items.Clear();
            foreach (LookupCampo campo in Campos)
            {
                cmbCampos.Items.Insert(i, campo.Nome);
                i++;
            }
            cmbCampos.SelectedIndex = 0;


            /* Prepara o Grid */
            dgvLookup.AutoSize = false;
            foreach (Coluna coluna in Colunas)
            {
                DataGridViewColumn dgvc = new DataGridViewTextBoxColumn();

                if (coluna.visivel)
                    dgvc.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;

                dgvc.Visible = coluna.visivel;


                dgvc.DataPropertyName = coluna.Field;
                dgvc.Name = coluna.Nome;
                dgvc.Width = coluna.largura;

                /* Formata coluna Currency */
                if (coluna.formato == ",0.00")
                    dgvc.DefaultCellStyle.Format = "n";
                else if (coluna.formato == "R,0.00")
                    dgvc.DefaultCellStyle.Format = "c";
                else
                    dgvc.DefaultCellStyle.Format = coluna.formato;

                dgvLookup.Columns.Add(dgvc);
            }

            /* Retorno */
            for (i = 0; i <= Retorno.Length - 1; i++)
            {
                DataGridViewColumn dgvc = new DataGridViewTextBoxColumn();
                dgvc.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
                dgvc.Visible = false;

                dgvc.DataPropertyName = "ret" + i.ToString();
                dgvc.Name = "ret" + i.ToString();
                dgvc.Width = 1;
                dgvLookup.Columns.Add(dgvc);
            }

        }
        /* FIM - Prepara a tela */



    }
}
